﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Kohvik.Kohvikuteenus;

namespace Kohvik {

    public partial class muudatoitu : System.Web.UI.Page {

        const int maxPortsSoodus = 6;   //kui mitu portsude või soodustuste lahtrit kasutaja saab maksimaalselt tekitada

        ServiceClient klient = new ServiceClient();
        EntityKaup kaup;
        List<EntityValuuta> valuutad;
        int olemineID;

        protected void Page_Load(object sender, EventArgs e) {
            if (Session["kasutaja_ID"] == null || Session["kohviku_ID"] == null) {
                Response.Redirect("admin.aspx");
            }

            String id = Request["olID"];                
            if (!int.TryParse(id, out olemineID)) {
                ph_error.Controls.Add(new LiteralControl("<h1>Viga ID parsimisel</h1>"));
                return;
            }

            if (!IsPostBack) {
                kaup = klient.getItemByOlemineId(olemineID);
                valuutad = klient.getCurrency();

                if (kaup == null) {
                    ph_error.Controls.Add(new LiteralControl("<h1>Ei õnnestunud kauba andmeid laadida</h1>"));
                    return;
                }
                if (valuutad == null) {
                    ph_error.Controls.Add(new LiteralControl("<h1>Ei õnnestunud valuutade andmeid laadida</h1>"));
                    return;
                }

                TB_kuup.Text = kaup.Date.ToString("yyyy-MM-dd");

                int portsudearv;
                if (kaup.portsjonid == null) {
                    portsudearv = 0;
                }
                else { 
                    portsudearv = kaup.portsjonid.Count;
                }

                int soodukatearv;
                if (kaup.soodukad == null) {
                    soodukatearv = 0;
                }
                else {
                    soodukatearv = kaup.soodukad.Count;
                }

                toit0_nimi.Text = kaup.Nimetus;
                toit0_kat.Text = kaup.Kategooria.Nimetus;

                Button b;

                for (int portsuNr = 0; portsuNr < portsudearv; portsuNr++) {
                    lisaPorts(0, portsuNr);
                }
                    
                b = new Button();                
                b.ID = "toit0_lisaports";
                b.Text = "lisa veel üks ports";
                b.OnClientClick = "javascript:__doPostBack(\"lisaports\",\"" + 0.ToString() + "\");";                
                ph_portsud.Controls.Add(b);
                b = new Button();
                b.ID = "toit0_eemaldaports";
                b.Text = "eemalda viimane ports";
                b.OnClientClick = "javascript:__doPostBack(\"eemaldaports\",\"" + 0.ToString() + "\");";
                ph_portsud.Controls.Add(b);

                for (int soodukaNr = 0; soodukaNr < soodukatearv; soodukaNr++) {
                    lisaSoodustus(0, soodukaNr);
                }
                    

                b = new Button();
                b.ID = "toit0_lisasoodustus";
                b.Text = "lisa veel üks soodustus";
                b.OnClientClick = "javascript:__doPostBack(\"lisasoodustus\",\"" + 0.ToString() + "\");";
                ph_soodukad.Controls.Add(b);
                b = new Button();
                b.ID = "toit0_eemaldasoodustus";
                b.Text = "eemalda viimane soodustus";
                b.OnClientClick = "javascript:__doPostBack(\"eemaldasoodustus\",\"" + 0.ToString() + "\");";
                ph_soodukad.Controls.Add(b);

                ViewState.Add("toit0_portsud", portsudearv);
                ViewState.Add("toit0_soodukad", soodukatearv);
            }

            if (Request.Form["__EVENTTARGET"] != null) {
                string s = Request.Form["__EVENTTARGET"];
                string[] str;
                int i;
                switch (s) {
                    case "lisaports":
                        ButtonLisaPorts_Click();
                        break;
                    case "eemaldaports":
                        str = (Request.Form["__EVENTARGUMENT"]).Split('&');
                        i = int.Parse(str[0]);
                        int k = int.Parse(str[1]);
                        ButtonEemaldaPorts_Click(i, k);
                        break;
                    case "lisasoodustus":
                        ButtonLisaSoodukas_Click();
                        break;
                    case "eemaldasoodustus":
                        str = (Request.Form["__EVENTARGUMENT"]).Split('&');
                        i = int.Parse(str[0]);
                        int l = int.Parse(str[1]);
                        ButtonEemaldaSoodukas_Click(i, l);
                        break;
                    case "submit":
                        muudaKaupa();
                        break;
                    default: break;
                }
            }

        }


        private void koostaLeht() {
            valuutad = klient.getCurrency();

            Button b;
                
            int i = 0;   //kui soovida muuta mitut toitu korraga, siis lisada for tsükkel
            int portse = Int32.Parse(ViewState["toit" + i + "_portsud"].ToString());
            int soodukaid = Int32.Parse(ViewState["toit" + i + "_soodukad"].ToString());

            for (int k = 0; k < portse; k++) {
                lisaPorts(i, k);
            }

            b = new Button();
            ClientScript.GetPostBackEventReference(b, 1.ToString());    //vajalik, et __dopostback lisataks lehele
            b.ID = "toit" + i + "_lisaports";
            b.Text = "lisa veel üks ports";
            b.OnClientClick = "javascript:__doPostBack(\"lisaports\",\"" + i.ToString() + "\");";
            ph_portsud.Controls.Add(b);

            for (int l = 0; l < soodukaid; l++) {
                lisaSoodustus(i, l);
            }

            b = new Button();
            b.ID = "toit" + i + "_lisasoodustus";
            b.Text = "lisa veel üks soodustus";
            b.OnClientClick = "javascript:__doPostBack(\"lisasoodustus\",\"" + i.ToString() + "\");";
            ph_soodukad.Controls.Add(b);            
        }


        private void lisaPorts(int i, int k) {
            TextBox tmp;
            DropDownList tmp2;
            ph_portsud.Controls.Add(new LiteralControl("<p>Nimi: "));
            tmp = new TextBox();
            tmp.ID = "toit" + i + "_ports" + k + "_nimi";
            if (kaup != null) {
                tmp.Text = kaup.portsjonid[k].Nimetus;
            }
            ph_portsud.Controls.Add(tmp);
            ph_portsud.Controls.Add(new LiteralControl("Hind: "));
            tmp = new TextBox();
            tmp.ID = "toit" + i + "_ports" + k + "_hind";
            if (kaup != null) {
                tmp.Text = kaup.portsjonid[k].Hind.ToString();
            }
            ph_portsud.Controls.Add(tmp);
            ph_portsud.Controls.Add(new LiteralControl("Valuuta: "));
            tmp2 = new DropDownList();
            foreach (EntityValuuta item in valuutad) {
                tmp2.Items.Add(item.Nimetus);
            }
            tmp2.ID = "toit" + i + "_ports" + k + "_valuuta";
            if (kaup != null) {
                tmp2.SelectedIndex = valuutad.FindIndex(val => val.Id == kaup.portsjonid[k].Valuuta_ID) - 1;
            }
            ph_portsud.Controls.Add(tmp2);
            ph_portsud.Controls.Add(new LiteralControl("Saadaval: "));
            tmp2 = new DropDownList();
            tmp2.Items.Add("Jah");
            tmp2.Items.Add("Ei");
            if (kaup != null) {
                if (kaup.portsjonid[k].Saadaval) {
                    tmp2.SelectedIndex = 0;
                }
                else {
                    tmp2.SelectedIndex = 1;
                }
            }
            tmp2.ID = "toit" + i + "_ports" + k + "_saadavus";
            ph_portsud.Controls.Add(tmp2);
            ImageButton btn = new ImageButton();
            btn.ImageUrl = @"images/ico_delete.png";
            btn.Height = 20;
            btn.OnClientClick = "javascript:__doPostBack(\"eemaldaports\",\"" + i + "&" + k + "\");";
            btn.AlternateText = "Kustuta see ports";
            btn.ToolTip = "Kustuta see ports";
            ph_portsud.Controls.Add(btn);
            ph_portsud.Controls.Add(new LiteralControl("</p>"));
        }


        private void lisaSoodustus(int i, int l) {
            TextBox tmp;
            DropDownList tmp2;
            ph_soodukad.Controls.Add(new LiteralControl("<p>Nimi: "));
            tmp = new TextBox();
            tmp.ID = "toit" + i + "_soodus" + l + "_nimi";
            if (kaup != null) {
                tmp.Text = kaup.soodukad[l].Liik;
            }
            ph_soodukad.Controls.Add(tmp);
            ph_soodukad.Controls.Add(new LiteralControl("Suurus: "));
            tmp = new TextBox();
            tmp.ID = "toit" + i + "_soodus" + l + "_suurus";
            if (kaup != null) {
                tmp.Text = kaup.soodukad[l].Suurus.ToString();
            }
            ph_soodukad.Controls.Add(tmp);
            ph_soodukad.Controls.Add(new LiteralControl("Ühik: "));
            tmp2 = new DropDownList();
            tmp2.Items.Add("%");
            foreach (EntityValuuta item in valuutad) {
                tmp2.Items.Add(item.Nimetus);
            }
            tmp2.ID = "toit" + i + "_soodus" + l + "_yhik";
            if (kaup != null) {
                tmp2.SelectedValue = kaup.soodukad[l].Yhik;
            }
            ph_soodukad.Controls.Add(tmp2);
            ImageButton btn = new ImageButton();
            btn.ImageUrl = @"images/ico_delete.png";
            btn.Height = 20;
            btn.OnClientClick = "javascript:__doPostBack(\"eemaldasoodustus\",\"" + i + "&" + l + "\");";
            btn.AlternateText = "Kustuta see soodustus";
            btn.ToolTip = "Kustuta see soodustus";
            ph_soodukad.Controls.Add(btn);
            ph_soodukad.Controls.Add(new LiteralControl("</p>"));
        }


        protected void ButtonLisaPorts_Click() {
            int tmp = Int32.Parse(ViewState["toit0_portsud"].ToString());
            if (tmp < maxPortsSoodus) {
                ViewState["toit0_portsud"] = tmp + 1;
            }
            koostaLeht();
        }


        protected void ButtonEemaldaPorts_Click(int i, int k) {
            int tmp = Int32.Parse(ViewState["toit" + i + "_portsud"].ToString());

            System.Reflection.MethodInfo WritableMethod;
            System.Reflection.MethodInfo ReadOnlyMethod;
            System.Reflection.BindingFlags Flags = System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Static;

            WritableMethod = Request.Form.GetType().GetMethod("MakeReadWrite", Flags);
            ReadOnlyMethod = Request.Form.GetType().GetMethod("MakeReadOnly", Flags);

            //System.Reflection.FieldInfo FormField = Request.GetType().GetField("_form", Flags);

            WritableMethod.Invoke(Request.Form, null);

            if (tmp > 0) {
                //kui ports eemaldatakse teiste vahelt, siis tuleb kastide sisu ka ühe võrra ümber tõsta
                for (k = k + 1; k < tmp; k++) {
                    Request.Form["ctl00$MainContent$toit" + i + "_ports" + (k - 1) + "_nimi"] = Request.Form["ctl00$MainContent$toit" + i + "_ports" + k + "_nimi"];
                    Request.Form["ctl00$MainContent$toit" + i + "_ports" + (k - 1) + "_hind"] = Request.Form["ctl00$MainContent$toit" + i + "_ports" + k + "_hind"];
                    Request.Form["ctl00$MainContent$toit" + i + "_ports" + (k - 1) + "_valuuta"] = Request.Form["ctl00$MainContent$toit" + i + "_ports" + k + "_valuuta"];
                    Request.Form["ctl00$MainContent$toit" + i + "_ports" + (k - 1) + "_saadavus"] = Request.Form["ctl00$MainContent$toit" + i + "_ports" + k + "_saadavus"];
                }
                ViewState["toit" + i + "_portsud"] = tmp - 1;
            }
            koostaLeht();
        }


        protected void ButtonLisaSoodukas_Click() {
            int tmp = Int32.Parse(ViewState["toit0_soodukad"].ToString());
            if (tmp < maxPortsSoodus) {
                ViewState["toit0_soodukad"] = tmp + 1;
            }
            koostaLeht();
        }


        protected void ButtonEemaldaSoodukas_Click(int i, int l) {
            int tmp = Int32.Parse(ViewState["toit" + i + "_soodukad"].ToString());

            System.Reflection.MethodInfo WritableMethod;
            System.Reflection.MethodInfo ReadOnlyMethod;
            System.Reflection.BindingFlags Flags = System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Static;

            WritableMethod = Request.Form.GetType().GetMethod("MakeReadWrite", Flags);
            ReadOnlyMethod = Request.Form.GetType().GetMethod("MakeReadOnly", Flags);

            //System.Reflection.FieldInfo FormField = Request.GetType().GetField("_form", Flags);

            WritableMethod.Invoke(Request.Form, null);

            if (tmp > 0) {
                //kui soodukas eemaldatakse teiste vahelt, siis tuleb kastide sisu ka ühe võrra ümber tõsta
                for (l = l + 1; l < tmp; l++) {
                    Request.Form["ctl00$MainContent$toit" + i + "_soodus" + (l - 1) + "_nimi"] = Request.Form["ctl00$MainContent$toit" + i + "_soodus" + l + "_nimi"];
                    Request.Form["ctl00$MainContent$toit" + i + "_soodus" + (l - 1) + "_suurus"] = Request.Form["ctl00$MainContent$toit" + i + "_soodus" + l + "_suurus"];
                    Request.Form["ctl00$MainContent$toit" + i + "_soodus" + (l - 1) + "_yhik"] = Request.Form["ctl00$MainContent$toit" + i + "_soodus" + l + "_yhik"];
                }
                ViewState["toit" + i + "_soodukad"] = tmp - 1;
            }
            koostaLeht();
        }


        private void muudaKaupa() {
            valuutad = klient.getCurrency();

            string date = Request.Form["ctl00$MainContent$TB_kuup"];

            DateTime tmp;
            if (!DateTime.TryParse(date, out tmp)) {
                ph_error.Controls.Add(new LiteralControl("<h1>Viga kuupäeva parsimisel</h1>"));
                koostaLeht();
                return;                    
            }            

            List<EntityPorts> portsud;
            List<EntitySoodustus> soodukad;

            int k = Int32.Parse(ViewState["toit0_portsud"].ToString()) - 1;
            int l = Int32.Parse(ViewState["toit0_soodukad"].ToString()) - 1;

            portsud = new List<EntityPorts>(k + 1);
            for (; k >= 0; k--) {
                portsud.Add(new EntityPorts {
                    Nimetus = Request.Form["ctl00$MainContent$toit0_ports" + k + "_nimi"],
                    Hind = Double.Parse(Request.Form["ctl00$MainContent$toit0_ports" + k + "_hind"], new System.Globalization.CultureInfo("en-US")),
                    Valuuta_ID = valuutad.Find(item => item.Nimetus.Equals(Request.Form["ctl00$MainContent$toit0_ports" + k + "_valuuta"])).Id,
                    Saadaval = toBool(Request.Form["ctl00$MainContent$toit0_ports" + k + "_saadavus"])
                });
            }   //END for k

            soodukad = new List<EntitySoodustus>(l + 1);
            for (; l >= 0; l--) {
                soodukad.Add(new EntitySoodustus {
                    Liik = Request.Form["ctl00$MainContent$toit0_soodus" + l + "_nimi"],
                    Suurus = Double.Parse(Request.Form["ctl00$MainContent$toit0_soodus" + l + "_suurus"], new System.Globalization.CultureInfo("en-US")),
                    Yhik = Request.Form["ctl00$MainContent$toit0_soodus" + l + "_yhik"]
                });
            }   //END for l

            EntityKaup kaup = new EntityKaup {
                Nimetus = Request.Form["ctl00$MainContent$toit0_nimi"],
                Kategooria = new EntityKategooria { Nimetus = Request.Form["ctl00$MainContent$toit0_kat"] },
                portsjonid = portsud,
                soodukad = soodukad
            };

            if (klient.editItem(olemineID, kaup.Kategooria.Nimetus, kaup.Nimetus, date, kaup.portsjonid, kaup.soodukad)) {
                Response.Redirect("muudatused.aspx");
            }
            else {
                koostaLeht();
                ph_error.Controls.Add(new LiteralControl("<h1>Viga toidu muutmisel, proovi uuesti</h1>"));
            }
        }   //END lisaKaubad()


        private bool toBool(string p) {
            if (p.Equals("Jah")) {
                return true;
            }
            else {
                return false;
            }
        }

    }
}